package top.sxlai.util.hbase;


import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

/**
 * @author : sxl
 * @date : 2024/4/4 10:02
 * @Version: 1.0
 * 用于命令空间和表格
 */
public class HbaseDDL {

    //添加静态属性connection指向单例连接
    public static Connection connection = HbaseConnection.connection;

    /**
     * 创建命令空间
     *
     * @param namespace 命名空间名称
     * @throws IOException
     */

    public static void createNamespace(String namespace) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();
        //2.调用方法创建命名空间
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);
        //3.调用方法创建命名空间
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e) {
            System.out.println("创建命名空间失败");
            throw new RuntimeException(e);
        }
        //4.关闭资源
        admin.close();
    }

    /**
     * 判断表格是否存在
     * @param namespace 命令空间
     * @param tableName 表格名
     * @return true表示存在
     */
    public static boolean isTableExists(String namespace, String tableName) throws IOException {
        // 1.获取admin
        Admin admin = connection.getAdmin();
        // 2.调用方法判断表格是否存在
        boolean flag = false;
        try {
            flag = admin.tableExists(TableName.valueOf(namespace, tableName));
        } catch (IOException e) {
          e.printStackTrace();
        }
        // 3.关闭资源
        admin.close();
        // 4.返回结果
        return flag;
    }

    /**
     * 创建表格
     * @param namespace 命名空间
     * @param tableName 表格名称
     * @param columnFamilies 列族名称
     * @throws IOException
     */
    public static void createTable(String namespace, String tableName, String... columnFamilies) throws IOException {
        //判断是否至少有一个列族
        if (columnFamilies.length == 0) {
            return;
        }
        //判断表格是否存在
        if (isTableExists(namespace, tableName)) {
            //已经存在
            return;
        }
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.1创建表描述器
        TableDescriptorBuilder tableDescriptorBuilder =
                TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace, tableName));

        //2.2循环添加列族

        for (String columnFamily : columnFamilies) {
            //2.3创建列族描述器
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder =
                    ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));

            // 2.4对应当前的列族添加参数
            //添加版本参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);
            // 2.5创建添加完毕的列族描述
            tableDescriptorBuilder.addColumnFamily(columnFamilyDescriptorBuilder.build());
        }

        //2.6 创建对应的表格描述
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        // 3 关闭资源
        admin.close();
    }

    /**
     * 删除表格
     * @param namespace
     * @param tableName
     * @return true表示成功，false表示失败
     * @throws IOException
     */

    public static boolean deleteTable(String namespace, String tableName) throws IOException {
        //1.判断表格是否存在
        if (!isTableExists(namespace, tableName)) {
            return false;
        }
        //2.获取admin
        Admin admin = connection.getAdmin();
        //3.删除表格

        try {
            //删除表格之前，先标记表格不可用
            TableName tableName1 = TableName.valueOf(namespace, tableName);
            admin.disableTable(tableName1);
            admin.deleteTable(tableName1);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //4.关闭资源
        admin.close();
        return true;
    }

}
